package traitement;

import javax.xml.bind.JAXBElement;
import javax.xml.namespace.QName;

import constructeurEleve.EvaluationEleve;
import constructeurEleve.EvaluationEleve.ExercicesEleve;
import constructeurEleve.EvaluationEleve.ExercicesEleve.ExerciceEleve;
import constructeurEleve.EvaluationEleve.ExercicesEleve.ExerciceEleve.QuestionsEleve;
import constructeurEleve.EvaluationEleve.ExercicesEleve.ExerciceEleve.QuestionsEleve.QuestionEleve;
import constructeurEleve.EvaluationEleve.ExercicesEleve.ExerciceEleve.QuestionsEleve.QuestionEleve.CorrectionEleve;
import constructeurEvaluation.Evaluation;
import constructeurEvaluation.Evaluation.Exercices;
import constructeurEvaluation.Evaluation.Exercices.Exercice;
import constructeurEvaluation.Evaluation.Exercices.Exercice.Questions;
import constructeurEvaluation.Evaluation.Exercices.Exercice.Questions.Question;
import constructeurEvaluation.Evaluation.Exercices.Exercice.Questions.Question.Correction;


public class TraitementEleve {

	public TraitementEleve() {
	}
	
	/**
	 * Traitement de l'�valuation
	 * @param eval Evaluation du professeur contenant les r�ponses
	 * @return evaluation sans les r�ponses
	 * @throws CloneNotSupportedException 
	 */
	public  EvaluationEleve produireDocDeQuestions(Evaluation eval) throws CloneNotSupportedException{
		Evaluation evaluation = eval.clone();
		EvaluationEleve evaluationEleve = new EvaluationEleve();
		
		evaluationEleve.setPreambuleEleve(evaluation.getPreambule());
		evaluationEleve.setExercicesEleve(produireDocDeQuestions(evaluation.getExercices()));
		
		return evaluationEleve;
	}
	
	/**
	 * Traitement des exercices
	 * @param exercices Tous les exercices de l'evaluation
	 * @return tous les exercices de l'�valuation sans les r�ponses
	 */
	private ExercicesEleve produireDocDeQuestions(Exercices exercices){
		ExercicesEleve exercicesEleve = new ExercicesEleve();
		
		for(int i = 0; i < exercices.getExercice().size(); i++){
			ExerciceEleve exerciceEleve = produireDocDeQuestions(exercices.getExercice().get(i));
			exercicesEleve.getExerciceEleve().add(exerciceEleve);
		}		
				
		return exercicesEleve;
	}
	
	/**
	 * Traitement d'un exercice
	 * @param exercice Un exercices de l'�valuation
	 * @return l'exercice de l'�valuation dans les r�ponses
	 */
	private ExerciceEleve produireDocDeQuestions(Exercice exercice) {
		ExerciceEleve exerciceEleve = new ExerciceEleve();
		
		exerciceEleve.setEnonceEleve(exercice.getEnonce());
		exerciceEleve.setTitreEleve(exercice.getTitre());
		exerciceEleve.setQuestionsEleve(produireDocDeQuestions(exercice.getQuestions()));
		
		return exerciceEleve;
	}

	/**
	 * Traitement des questions
	 * @param questions toutes les questions d'un exercices de l'�valuation
	 * @return toutes les questions d'un exercices de l'�valuation sans les r�ponses
	 */
	private QuestionsEleve produireDocDeQuestions(Questions questions) {
		QuestionsEleve questionsEleve = new QuestionsEleve();
		
		for(int i = 0; i < questions.getQuestion().size(); i++){
			QuestionEleve questionEleve = produireDocDeQuestions(questions.getQuestion().get(i));
			questionsEleve.getQuestionEleve().add(questionEleve);
		}		
				
		return questionsEleve;
	}

	/**
	 * Traitement d'une question d'un exercice d'une �valuation
	 * @param question Une question d'un exercice d'une �valuation
	 * @return la question de l'exercice de l'�valuation sans les r�ponses
	 */
	private QuestionEleve produireDocDeQuestions(Question question) {
		QuestionEleve questionEleve = new QuestionEleve();
		
		questionEleve.setConsigneEleve(question.getConsigne());
		questionEleve.setType(question.getType());
		questionEleve.setCorrectionEleve(produireDocDeQuestions(question.getCorrection()));
		
		return questionEleve;
	}
	
	private CorrectionEleve produireDocDeQuestions(Correction correction) {
		CorrectionEleve correctionEleve = new CorrectionEleve();
		
		for(int i = 0; i < correction.getContent().size(); i++){
			if(correction.getContent().get(i).getClass().equals(JAXBElement.class)){
				if(((JAXBElement) correction.getContent().get(i)).getName().getLocalPart().equals("enonce")){
					QName qn = new QName(null, "enonceEleve", "...");
					JAXBElement elem = new JAXBElement(qn, String.class, ((JAXBElement) correction.getContent().get(i)).getValue());
					correctionEleve.getContent().add(elem);
				}
				else if(((JAXBElement) correction.getContent().get(i)).getName().getLocalPart().equals("reponse")){
					//element = ((JAXBElement) correction.getContent().get(i));
					QName qn = new QName(null, "ACompleter", "...");
					JAXBElement elem = new JAXBElement(qn, String.class, "...");
					correctionEleve.getContent().add(elem);
			
				}
			}
		}		
				
		return correctionEleve;
	}
}
